package com.hts.spring06.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.logging.Logger;
/*
   定义一个切面类
 */
@Component
@Aspect
public class LogAspect {
    Logger logger = Logger.getLogger("DynamicProxy");

    // 单独定义一个切入点  cut：剪    point ：点
    @Pointcut("execution(* com.hts.spring06.utils.*.ch*(..))")
    public void pointCut() {

    }


     /*
       切入点
       1. 什么时间 (方法开始的时间)
       2. 什么方法(地点)
       3. 做什么动作 (日志记录)

        Before: 前置增强
        筛选出切入点: execution(Integer com.lyl.spring06.utils.*.add(..))
        做什么事情: 方法里面的具体实现

          返回值   包名.方法的签名(参数)
          * com.lyl.spring06.utils.*.add(..))
          * : 任何类型的返回值
      */

    /*
        前置增强： 方法执行前加强处理
     */
    @Before("pointCut()")
    public  void start() {
        logger.info("【日志】【开始】");
    }


    @AfterReturning(value = "pointCut()",
            returning = "result")
    // JoinPoint: 连接点
    public void afterReturning(JoinPoint jp,Object result) {
        logger.info("正常返回之后调用的方法");
        logger.info("返回值为："+result);
        logger.info(jp.getSignature().getName());
        logger.info(jp.getArgs()[0].toString());
        logger.info(jp.getArgs()[1].toString());
    }


    @AfterThrowing(value = "pointCut()",
            throwing = "e")
    public void afterExecution(JoinPoint jp,Exception e) {
        logger.info("出了异常"+ "异常增强");
        logger.info(e.getMessage());

    }

    @After("pointCut()")
    public void end(){
        logger.info("方法结束之后的增强处理");
    }








}
